package workgroup.osaka;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.content.Context;
import android.media.AudioManager;
import android.util.Log;

/* **************************************
 * アラーム情報クラス
 * <p>
 * アラームリストの下記情報を保持する。
 * ・アラーム時刻
 * ・繰り返し曜日
 * ・スヌーズ間隔
 * ・祝日鳴動停止ON
 * ・アラーム音量
 * ・バイブレーションON
 * ・アラームON
 * </p>
 * ************************************** */
public class AlarmInfo implements Serializable {
    private final String TAG = "AlarmStatus"; 
    private static final long serialVersionUID = -8788040950715818838L;
    private int     alarmId;            // アラームID
    private String  alarmTime;          // アラーム時刻（24h表記。00:00)
    private String  repeatingDay;       // 繰り返し曜日
    private int     snoozeInterval;     // スヌーズ間隔
    private boolean holidayAlarmStop;   // 祝日鳴動停止ON true:祝日は鳴らさない false:祝日による制約なし
    private int     alarmVol;           // アラーム音量
    private boolean vibration;          // バイブレーションON true:バイブレーションON false:バイブレーションOFF
    private boolean alarmOn;            // アラームON true:アラームON false:アラームOFF
    
    public AlarmInfo(Context context) {
        //------------------
        // パラメータ時刻初期化
        //------------------
            // アラームID -1はDB未登録
        setAlarmId(-1);
            // アラーム時刻 現在の時間に設定する
        Date now = new Date();
        SimpleDateFormat alarmTimeForm = new SimpleDateFormat("HH':'mm");
        setAlarmTime(alarmTimeForm.format(now));
            // 繰り返し曜日 全角空白を曜日分(７文字)設定する
        setRepeatingDay("　　　　　　　");
            // スヌーズ間隔 初期値は3
        setSnoozeInterval(3);
            // 祝日鳴動停止ON falseに設定する
        setHolidayAlarmStop(false);
            // アラーム音量 初期値は着信音量。取得できなかった場合は50
        AudioManager audio = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        try {
            setAlarmVol(audio.getStreamVolume(AudioManager.STREAM_ALARM));
        } catch (Exception e) {
            setAlarmVol(50);
        }
            // バイブレーションON falseに設定
        setVibration(false);
        
            // アラームON trueに設定する
        setAlarmOn(true);
    }
    /*==================================
     * alarmId ゲッター
     *==================================*/    
    public int getAlarmId() {
        return alarmId;
    }
    
    /*==================================
     * alarmId セッター
     *==================================*/
    public void setAlarmId(int alarmId) {
        this.alarmId = alarmId;
    }

    /*==================================
     * alarmTime セッター
     * アラーム時刻をチェックし、登録する。
     * アラーム時刻のフォーマットは24h表記・00:00
     *==================================*/
    public void setAlarmTime(String time) {
        Calendar cal = Calendar.getInstance(); // デフォルトのタイムゾーンとロケールからカレンダー作成
        cal.setLenient(false);
        String[] timeAry = time.split(":");
        if ( timeAry.length !=2 ) {
            Log.e(TAG, "フォーマットエラー:" + time);
            return;
        }
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeAry[0]));
        cal.set(Calendar.MINUTE, Integer.parseInt(timeAry[1]));
        try {
            cal.getTime();
        } catch(IllegalArgumentException e) {
            Log.e(TAG, "存在しない日付:" + time);
            return;
        }
        this.alarmTime = time;
    }
    /* ==================================
     * alarmTime ゲッター
     * ================================== */        
    public String getAlarmTime() {
        return alarmTime;
    }    
    /* ==================================
     * repeatingDay セッター
     * 繰り返し曜日をチェックし、登録する。
     * 繰り返し曜日は"月火水木金土日"もしくはこの文字列のいずれかが全角空白文字に入れ替わった文字列。
     * ================================== */
    public void setRepeatingDay(String days) {
        String diffStr = "月火水木金土日";
        if ( days.length() != diffStr.length() ) {
            Log.e(TAG, "フォーマットエラー:" + days);
            return;
        }
        for ( int i=0 ; i<diffStr.length(); i++ ) {
            if ( days.charAt(i) != '　' && days.charAt(i) != diffStr.charAt(i) ) {
                Log.e(TAG, "フォーマットエラー:" + days);
                return;
            }
        }
        this.repeatingDay = days;
    }
    /* ==================================
     * repeatingDay ゲッター
     * ================================== */
    public String getRepeatingDay() {
        return repeatingDay;
    }

    /* ===================================
     * snoozeInterval セッター
     * スヌーズ間隔はより大きい整数。
     * =================================== */
    public void setSnoozeInterval(int interval) {
        if ( interval <= 0 ) {
            Log.e(TAG, "interval:" + interval);
            return;
        }
        snoozeInterval = interval;
    }
    /* ===================================
     * snoozeInterval ゲッター
     * =================================== */
    public int getSnoozeInterval() {
        return snoozeInterval;
    }
    
    /* ===================================
     * holidayAlarmStop セッター
     * =================================== */
    public void setHolidayAlarmStop(boolean flag) {
        
        holidayAlarmStop = flag;
    }
    /* ===================================
     * holidayAlarmStop ゲッター
     * =================================== */
    public boolean getHolidayAlarmStop() {
        return holidayAlarmStop;
    }

    /* ===================================
     * alarmVol セッター
     * アラーム音量は0より大きい整数
     * =================================== */
    public void setAlarmVol(int vol) {
        if ( vol < 0 ) {
            Log.e(TAG, "vol:" + vol);
            return;
        }
        alarmVol = vol;
    }
    /* ===================================
     * alarmVol ゲッター
     * =================================== */
    public int getAlarmVol() {
        return alarmVol;
    }
    
    /* ===================================
     * vibration セッター
     * =================================== */
    public void setVibration(boolean flag) {
        vibration = flag;
    }
    /* ===================================
     * vibration ゲッター
     * =================================== */
    public boolean getVibration() {
        return vibration;
    }
    
    /* ===================================
     * alarmOn セッター
     * =================================== */
    public void setAlarmOn(boolean flag) {
        alarmOn = flag;
    }
    /* ====================================
     * alarmOn ゲッター
     * ==================================== */
    public boolean getAlarmOn() {
        return alarmOn;
    }
}
